#pragma once
#include <filesystem>
#include <opencv2/opencv.hpp>
#include <vector>
#include <string>
struct OcrResult
{
    std::wstring name_;
    cv::Rect rect_;
};

namespace CvUtil
{
    /**
     * @brief 将 cv::Mat 图像保存到文件，支持 Unicode (中文) 路径。
     * @param p 目标文件路径 (std::filesystem::path)。
     * @param img 要保存的图像 (cv::Mat)。
     * @param params 编码参数。
     * @return true 保存成功, false 保存失败。
     */
    bool imwrite_unicode(const std::filesystem::path &p, const cv::Mat &img, const std::vector<int> &params = {});

    bool imread_unicode(const std::filesystem::path &p, cv::Mat &img, int flags = cv::IMREAD_COLOR);
    /**
     * @brief 自动裁剪二值图像的空白区域。
     * @param img 输入二值图像 (cv::Mat)。
     * @return 裁剪后的图像 (cv::Mat)。
     */
    cv::Mat cropBinaryAuto(const cv::Mat &img);

    /**
     * @brief 根据给定颜色和容差进行二值化
     * @param image 输入图像 (BGR格式)
     * @param targetColor 目标颜色 (BGR格式)
     * @param tolerance 颜色容差范围
     * @return cv::Mat 二值化结果，匹配颜色区域为255，其他为0
     *
     * @note tolerance 参数说明：
     *   - 推荐范围: 10-50
     *   - 较小值 (10-20): 精确匹配，只选择与目标颜色非常接近的像素
     *   - 中等值 (20-40): 平衡选择，适合大多数应用
     *   - 较大值 (40-60): 宽松匹配，选择更广泛的颜色范围
     *   - 最大值: 理论上可达255，但实际应用中很少超过100
     */
    cv::Mat colorBinary(const cv::Mat &image, const cv::Vec3b &targetColor, int tolerance = 30);

    /**
     * @brief 高级版本：允许分别设置H、S、V通道的容差
     * @param image 输入图像 (BGR格式)
     * @param targetColor 目标颜色 (BGR格式)
     * @param h_tolerance H通道容差
     * @param s_tolerance S通道容差
     * @param v_tolerance V通道容差
     * @return cv::Mat 二值化结果
     */
    cv::Mat colorBinaryAdvanced(const cv::Mat &image, const cv::Vec3b &targetColor,
                                int h_tolerance = 30, int s_tolerance = 40, int v_tolerance = 40);

    cv::Rect findConnectedRectangles(const std::vector<std::vector<cv::Rect>> &results);

    /**
     * @brief 对OCR识别结果进行排序
     * @details 该函数根据OCR结果的矩形框位置，对识别到的文本进行排序。
     *          排序规则： 从左到右，从上到下排序。
     * @param ocrResults 包含多个OCR结果的二维向量
     * @param rects 包含多个矩形框位置的向量，用于存储排序后的矩形框位置
     * @return 排序后的OCR结果字符串
     */
    std::vector<std::wstring> sortOcrResults(const std::vector<OcrResult> &ocrResults, std::vector<cv::Rect> &rects);

} // namespace CvUtil
